package com.gkzf.ai.module.crm.util;

import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.FileUtils;
import org.springframework.core.io.FileSystemResource;
import org.springframework.http.*;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;

import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.nio.file.Files;
import java.util.UUID;

/**
 * @author Huawei
 * @date 2025-04-03 14:12
 */
@Slf4j
public class HttpUtils {

    public static final String DELEGATE_EXPRESSION = "${httpUtil}";

    /**
     * 上传文件接受json格式
     * @param restTemplate
     * @param file
     * @param url
     * @return
     * @throws Exception
     */
    @SneakyThrows
    public static String doPostFile(RestTemplate restTemplate, File file, String url){
        // 1. 创建请求头
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.MULTIPART_FORM_DATA);

        // 2. 创建请求体 (MultiValueMap)
        MultiValueMap<String, Object> body = new LinkedMultiValueMap<>();

        // 3 添加普通参数
        body.add("name", "征信报告");
        // 8 添加文件参数
        FileSystemResource fileResource = new FileSystemResource(file);
        body.add("file", fileResource); // "file" 是服务器端接收文件的参数名
        // 9. 创建 HttpEntity (包含请求头和请求体)
        HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(body, headers);
        ResponseEntity<String> response = null;
        // 10. 发送请求
        try {
            response = restTemplate.exchange(
                    url,
                    HttpMethod.POST,
                    requestEntity,
                    String.class);
            log.info("[httpUtil][监听器：{}，事件类型：{}，请求头：{}，请求体：{}，响应结果：{}]",
                    DELEGATE_EXPRESSION,
                    "征信报告文档上传",
                    headers,
                    body,
                    response);
        } catch (Exception e) {
            log.error("[error][监听器：{}，事件类型：{}，请求头：{}，请求体：{}，请求出错：{}]",
                    DELEGATE_EXPRESSION,
                    "征信报告文档上传",
                    headers,
                    body,
                    e.getMessage());
            e.printStackTrace(); // 打印更详细的错误信息，方便调试
        }finally {
            // 11. 删除临时文件
            Files.delete(file.toPath());
        }
        return null == response?null:response.getBody();
    }


    /**
     * post请求
     * @param restTemplate
     * @param paramMap 参数map
     * @param url
     * @return
     * @throws Exception
     */
    @SneakyThrows
    public static String doPost(RestTemplate restTemplate, String url, MultiValueMap<String,Object> paramMap){
        // 1. 创建请求头
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.MULTIPART_FORM_DATA);

        // 2. 创建请求体 (MultiValueMap)
        MultiValueMap<String, Object> body = new LinkedMultiValueMap<>();

        // 3 添加普通参数
        body.addAll(paramMap);
        // 8 添加文件参数
        // 9. 创建 HttpEntity (包含请求头和请求体)
        HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(body, headers);
        ResponseEntity<String> response = null;
        // 10. 发送请求
        try {
            response = restTemplate.exchange(
                    url,
                    HttpMethod.POST,
                    requestEntity,
                    String.class);
            log.info("[httpUtil][监听器：{}，事件类型：{}，请求头：{}，请求体：{}，响应结果：{}]",
                    DELEGATE_EXPRESSION,
                    "征信报告文档上传",
                    headers,
                    body,
                    response);
        } catch (Exception e) {
            log.error("[error][监听器：{}，事件类型：{}，请求头：{}，请求体：{}，请求出错：{}]",
                    DELEGATE_EXPRESSION,
                    "征信报告文档上传",
                    headers,
                    body,
                    e.getMessage());
             // 打印更详细的错误信息，方便调试
            e.printStackTrace();
        }
        return null == response?null:response.getBody();
    }

    /**
     * 下载远程文件到本地
     * @param fileUrl
     * @return
     */
    public static File downloadFile(String fileUrl){
        // 1. 创建临时文件
        String fileName = UUID.randomUUID().toString(); // 生成随机文件名
        File tempFile = null;  // 创建临时文件，后缀为空
        try {
            tempFile = File.createTempFile(fileName, ".pdf");
            // 2. 从 URL 下载文件到临时文件
            FileUtils.copyURLToFile(new URL(fileUrl), tempFile, 10000, 500000); // 超时时间10秒

            // 3. 下载成功，返回 File 对象
            return tempFile;
        } catch (IOException e) {
            // 下载失败，删除临时文件
            FileUtils.deleteQuietly(tempFile); // 静默删除，不抛异常
            try {
                throw e; // 重新抛出异常，让调用方处理
            } catch (IOException ex) {
                FileUtils.deleteQuietly(tempFile); // 静默删除，不抛异常
                e.printStackTrace();
            }
        }
        return null;
    }
}
